#include <iostream>
#include <string>
using namespace std;

//问题：在使用初始化列表，初始化类中的对象时，与有参构造函数使用赋值操作初始化类中的对象有何不同
//默认构造函数，有参构造函数，拷贝构造函数，析构函数
//当类的属性中有另一个对象时，使用赋值实现和使用初始化列表实现拷贝构造函数有何不同？
//定义一个属性中含有对象的对象时，如果初始化时没有初始化属性中的对象，那么会调用属性中对象的默认构造函数
//如果初始化时利用有参构造函数对属性中的对象进行初始化，那么所传参数形参的拷贝构造函数
//形参就是对象中的对象属性


class Car
{
public:
	Car()
	{
		cout << this << endl;
		cout << "Car 默认构造函数调用" << endl;
	}
	Car(const Car& x)
	{
		cout << this << endl;
		cout << "Car 拷贝构造函数的调用" << endl;
	}
	~Car()
	{
		cout << this << endl;
		cout << "Car 析构函数的调用" << endl;	
	}
	
private:
	string m_name;
	string m_num;
};

class Person
{
public:
	Person(Car x)
	{
		m_a = x;
		cout << this << endl;
		cout << "m_a" << &this->m_a << endl;
		cout << "Person 有参构造函数调用" << endl;
	}
	Person()
	{
		cout << this << endl;
		cout << "Person 默认构造函数调用" << endl;
	}
	Person(int age)
	{
		m_age = age;
		cout << this << endl;
		cout << "Person 有参构造函数调用" << endl;
	}
	//拷贝构造函数的传参为什么必须是对象的引用，防止死循环
	Person(const Person& x)
	{
		m_age = x.m_age;
		cout << this << endl;
		cout << "Person 拷贝构造函数调用" << endl;
	}
	~Person()
	{
		cout << this << endl;
		cout << "Person 析构函数的调用" << endl;
	}
	
private:
	Car m_a;
	int m_age;
};

//先实验使用赋值初始化

int main()
{
	cout << "赋值初始化" << endl;	
	Car x;
	Person Carl(x); 
//	int a(10);
//	cout << a << endl;
//	float b(10.0f);
//	cout << b << endl;

	return 0;
}
